import pulp
#第一步：定义模型
model = pulp.LpProblem(name="zhipai-prob", sense=pulp.LpMinimize)
#这个操作是使用 pl.LpProblem 创建了一个模型并赋值给变量 model，接收两个参数：

# 第二步：定义决策变量。
# 一般情况下遇到的线性规划问题中，自变量都比较多
# 用下面的方法可以方便快速定义较多决策变量：
a = {i: pulp.LpVariable(name=f"a{i}", cat=pulp.LpBinary) for i in range(1, 5)}
b = {i: pulp.LpVariable(name=f"b{i}", cat=pulp.LpBinary) for i in range(1, 5)}
c = {i: pulp.LpVariable(name=f"c{i}", cat=pulp.LpBinary) for i in range(1, 5)}
d = {i: pulp.LpVariable(name=f"d{i}", cat=pulp.LpBinary) for i in range(1, 5)}
e = {i: pulp.LpVariable(name=f"e{i}", cat=pulp.LpBinary) for i in range(1, 5)}
#用一个for循环写成range(1,11)实际上就包含了我们的x1到x10的这10个决策变量。

#   第三步：添加约束条件
#   对于每种比赛而言，只可能选派一个人参加
model += (a[1]+b[1]+c[1]+d[1]+e[1] == 1,'eq1')
model += (a[2]+b[2]+c[2]+d[2]+e[2] == 1,'eq2')
model += (a[3]+b[3]+c[3]+d[3]+e[3] == 1,'eq3')
model += (a[4]+b[4]+c[4]+d[4]+e[4] == 1,'eq4')
# 对于每个人而言，由于人数要多于比赛项目数，因此应该保证每一个人的决策变量加和小于等于1
model += (a[1]+a[2]+a[3]+a[4] <= 1,'eqa')
model += (b[1]+b[2]+b[3]+b[4] <= 1,'eqb')
model += (c[1]+c[2]+c[3]+c[4] <= 1,'eqc')
model += (d[1]+d[2]+d[3]+d[4] <= 1,'eqd')
model += (e[1]+e[2]+e[3]+e[4] <= 1,'eqe')

#   第四部：添加目标函数
model += 66.8*a[1]+75.6*a[2]+87*a[3]+58.6*a[4]+57.2*b[1]+66*b[2]+66.4*b[3]+53*b[4]+78*c[1]+67.8*c[2]+84.6*c[3]+59.4*c[4]+70*d[1]+74.2*d[2]+69.6*d[3]+57.2*d[4]+67.4*e[1]+71*e[2]+83.8*e[3]+62.4*e[4]

#   第五步：模型求解——很简单，就一句话
status = model.solve()
#   就写这一句话，调用 model 的 solve() 方法，并把结果保存在 status 中。

#   第六步：打印结果
print(f"status: {model.status}, {pulp.LpStatus[model.status]}")
print(f"objective: {model.objective.value()}")
for var in model.variables():
    print(f"{var.name}: {var.value()}")
for name, constraint in model.constraints.items():
    print(f"{name}: {constraint.value()}")
